home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / xexex.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  5KB  |  237 lines

  1. #include "driver.h"
  2. #include "vidhrdw/generic.h"
  3. #include "vidhrdw/konamiic.h"
  4.  
  5.  
  6. static int sprite_colorbase;
  7.  
  8.  
  9. /***************************************************************************
  10.  
  11.   Callbacks for the K053247
  12.  
  13. ***************************************************************************/
  14.  
  15. static void sprite_callback(int *code,int *color,int *priority_mask)
  16. {
  17.     *color = sprite_colorbase + (*color & 0x001f);
  18. }
  19.  
  20.  
  21.  
  22. static struct tilemap *K053157_char01_tilemap, *K053157_char11_tilemap;
  23. static int K053157_rambank, K053157_cur_rambank, K053157_rombank, K053157_cur_rombank, K053157_romnbbanks;
  24. static unsigned char *K053157_rambase, *K053157_cur_rambase, *K053157_rombase;
  25. static void (*K053157_cur_notifier)(int);
  26.  
  27. static void K053157_get_char01_tile_info(int tile_index)
  28. {
  29.     int attr = READ_WORD(K053157_rambase+4*tile_index+0x2000);
  30.     int code = READ_WORD(K053157_rambase+4*tile_index+0x2000+2);
  31.  
  32.     SET_TILE_INFO (0, code, ((attr + 0x300) & 0x7f0)>>4);
  33.     tile_info.flags = TILE_FLIPYX(attr & 3);
  34.  
  35. }
  36.  
  37. static void K053157_get_char11_tile_info(int tile_index)
  38. {
  39.     int attr = READ_WORD(K053157_rambase+4*tile_index+0xa000);
  40.     int code = READ_WORD(K053157_rambase+4*tile_index+0xa000+2);
  41.  
  42.     SET_TILE_INFO (0, code, ((attr + 0x700) & 0x7f0)>>4);
  43.     tile_info.flags = TILE_FLIPYX(attr & 3);
  44. }
  45.  
  46. static void K053157_char01_m(int offset)
  47. {
  48.     tilemap_mark_tile_dirty(K053157_char01_tilemap,offset/4);
  49. }
  50.  
  51. static void K053157_char11_m(int offset)
  52. {
  53.     tilemap_mark_tile_dirty(K053157_char11_tilemap,offset/4);
  54. }
  55.  
  56. static void (*K053157_modify_notifiers[8])(int) = {
  57.     0,                    // 00
  58.     K053157_char01_m,    // 01
  59.     0,                    // 08
  60.     0,                    // 09
  61.     0,                    // 10
  62.     K053157_char11_m,    // 11
  63.     0,                    // 18
  64.     0                    // 19
  65. };
  66.  
  67. int K053157_vh_start(int rambank, int rombank, int roms_memory_region)
  68. {
  69.     K053157_char01_tilemap = tilemap_create(K053157_get_char01_tile_info,tilemap_scan_rows,
  70.                                             TILEMAP_OPAQUE,8,8,64,32);
  71.  
  72.     K053157_char11_tilemap = tilemap_create(K053157_get_char11_tile_info,tilemap_scan_rows,
  73.                                             TILEMAP_TRANSPARENT,8,8,64,32);
  74.  
  75.     if(!K053157_char01_tilemap || !K053157_char11_tilemap)
  76.         return 1;
  77.  
  78.     K053157_char11_tilemap->transparent_pen = 0;
  79.  
  80.     K053157_rambank = rambank;
  81.     K053157_cur_rambank = 0;
  82.     K053157_rambase = malloc(0x2000*8);
  83.     K053157_cur_rambase = K053157_rambase;
  84.     K053157_cur_notifier = K053157_modify_notifiers[0];
  85.     cpu_setbank(K053157_rambank, K053157_cur_rambase);
  86.  
  87.     K053157_rombank = rombank;
  88.     K053157_cur_rombank = 0;
  89.     K053157_rombase = memory_region(roms_memory_region);
  90.     K053157_romnbbanks = memory_region_length(roms_memory_region)/0x2000;
  91.     cpu_setbank(K053157_rombank, K053157_rombase);
  92.  
  93.     return 0;
  94. }
  95.  
  96. WRITE_HANDLER( K053157_ram_w )
  97. {
  98.     unsigned char *adr = K053157_cur_rambase + offset;
  99.     int old = READ_WORD(adr);
  100.     COMBINE_WORD_MEM(adr, data);
  101.  
  102.     if(K053157_cur_notifier && (READ_WORD(adr) != old))
  103.         K053157_cur_notifier(offset);
  104. }
  105.  
  106. READ_HANDLER( K053157_r )
  107. {
  108.     logerror("K053157: unhandled read(%02x), pc=%08x\n", offset, cpu_get_pc());
  109.     return 0;
  110. }
  111.  
  112. WRITE_HANDLER( K053157_w )
  113. {
  114.     switch(offset) {
  115.     case 0x32: {
  116.         int nb;
  117.         data &= 0xff;
  118.         switch(data) {
  119.         case 0:
  120.             nb = 0;
  121.             break;
  122.         case 1:
  123.             nb = 1;
  124.             break;
  125.         case 8:
  126.             nb = 2;
  127.             break;
  128.         case 9:
  129.             nb = 3;
  130.             break;
  131.         case 0x10:
  132.             nb = 4;
  133.             break;
  134.         case 0x11:
  135.             nb = 5;
  136.             break;
  137.         case 0x18:
  138.             nb = 6;
  139.             break;
  140.         case 0x19:
  141.             nb = 7;
  142.             break;
  143.         default:
  144.             nb = 0;
  145.             logerror("Graphic bankswitching to unknown bank %02x (pc=%08x)\n", data, cpu_get_pc());
  146.         }
  147.  
  148.         K053157_cur_rambank = data;
  149.         K053157_cur_rambase = K053157_rambase + nb*0x2000;
  150.         K053157_cur_notifier = K053157_modify_notifiers[nb];
  151.  
  152.         cpu_setbank(K053157_rambank, K053157_cur_rambase);
  153.         break;
  154.     }
  155.     case 0x34: {
  156.         K053157_cur_rombank = data % K053157_romnbbanks;
  157.         cpu_setbank(K053157_rombank, K053157_rombase + 0x2000*K053157_cur_rombank);
  158.         break;
  159.     }
  160.     default:
  161.         logerror("K053157: unhandled write(%02x, %04x), pc=%08x\n", offset, data & 0xffff, cpu_get_pc());
  162.     }
  163. }
  164.  
  165. void K053157_update(void)
  166. {
  167.     tilemap_update(K053157_char01_tilemap);
  168.     tilemap_update(K053157_char11_tilemap);
  169. }
  170.  
  171. void K053157_render(void)
  172. {
  173.     tilemap_render(K053157_char01_tilemap);
  174.     tilemap_render(K053157_char11_tilemap);
  175. }
  176.  
  177. void K053157_draw(struct osd_bitmap *bitmap)
  178. {
  179.     tilemap_draw(bitmap, K053157_char01_tilemap, 0);
  180.     tilemap_draw(bitmap, K053157_char11_tilemap, 0);
  181. }
  182.  
  183.  
  184. extern unsigned char *xexex_palette_ram;
  185.  
  186. int xexex_vh_start(void)
  187. {
  188.     K053157_vh_start(2, 6, REGION_GFX1);
  189.     if (K053247_vh_start(REGION_GFX2,NORMAL_PLANE_ORDER,sprite_callback))
  190.     {
  191. //        K053157_vh_stop();
  192.         return 1;
  193.     }
  194.     return 0;
  195. }
  196.  
  197. void xexex_vh_stop(void)
  198. {
  199. //    K053157_vh_stop();
  200.     K053247_vh_stop();
  201. }
  202.  
  203.  
  204. WRITE_HANDLER( xexex_palette_w )
  205. {
  206.     int r, g, b;
  207.     int data0, data1;
  208.  
  209.     COMBINE_WORD_MEM(xexex_palette_ram+offset, data);
  210.  
  211.     offset &= ~3;
  212.  
  213.     data0 = READ_WORD(xexex_palette_ram + offset);
  214.     data1 = READ_WORD(xexex_palette_ram + offset + 2);
  215.  
  216.     r = data0 & 0xff;
  217.     g = data1 >> 8;
  218.     b = data1 & 0xff;
  219.  
  220.     palette_change_color(offset>>2, r, g, b);
  221. }
  222.  
  223.  
  224. void xexex_vh_screenrefresh(struct osd_bitmap *bitmap, int full_refresh)
  225. {
  226.     K053157_update();
  227.  
  228.     palette_init_used_colors();
  229.     K053247_mark_sprites_colors();
  230.     if (palette_recalc())
  231.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  232.  
  233.     K053157_render();
  234.     K053157_draw(bitmap);
  235.     K053247_sprites_draw(bitmap);
  236. }
  237.